package com.chat.utils;

import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

@Slf4j
public class ExecutorServiceUtil {

    private static final int MAX_THREADS = 10; // 最大线程数写死为10

    /**
     * 执行一组有返回值的任务，并等待它们全部完成
     * @param tasks 任务列表
     * @param <T> 任务返回值的类型
     * @return 所有任务的返回值列表
     */
    public static <T> List<T> executeAndWaitForResults(List<Callable<T>> tasks) {
        // 创建线程池，线程数为任务数和MAX_THREADS中的较小值
        ExecutorService executorService = Executors.newFixedThreadPool(Math.min(tasks.size(), MAX_THREADS));
        List<T> results = new ArrayList<>();

        try {
            // 提交所有任务
            List<Future<T>> futures = executorService.invokeAll(tasks);

            // 收集所有任务的返回值
            for (Future<T> future : futures) {
                try {
                    results.add(future.get()); // 这里可以处理异常，或者添加超时等
                } catch (Exception e) {
                    log.warn("任务执行异常");
                }
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt(); // 设置中断标志
            log.warn("任务执行中断");
        } finally {
            // 关闭线程池
            executorService.shutdown();
        }

        return results;
    }
}
